#ifndef MAPINFOWRITE_H
#define MAPINFOWRITE_H

#include "commondefine.h"
#include "mapinfo.h"
#include "../opxml/rwxml.h"
#include "../opxml/globalrwxml.h"


class MapInfoWrite
{
public:
    MapInfoWrite();
    ~MapInfoWrite();

    //重置mapinfo所有节点信息
    void resetMapInfo();

    //把mapInfo中的所有信息添加到全局XML(GlobalRwXml)中，添加前会先删除原有的MapInfo所有相关节点
    void addMapInfo();

    //删除所有地图信息
    void delMapInfo();

    //重置header节点
    void resetHeader();

    //添加header节点，为保证只有一个header，如果已有的header会先删掉
    void addHeader(const Header &header);

    //删除header节点
    void delHeader();
    //void updateHeader(const Header &header);

    //先清空所有road节点，然后把MapInfo中的road信息重新添加进去
    void resetRoad();

    //添加一个road节点
    void addRoad(const SRoad &road);

    //删除全部road节点
    void delRoad();

    //删除指定road节点
    void delRoad(const SRoad &road);

    //删除指定road节点
    void delRoad(const std::string &roadId);

    //更新指定road节点
    void updateRoad(const SRoad &road);

    //road节点子孙节点内容 begin
    void addRoadLink(TiXmlElement *pRoad, const RoadLink roadLink);
    void delRoadLink(TiXmlElement *pRoad);

    void addRoadType(TiXmlElement *pRoad, const RoadType roadType);
    void delRoadType(TiXmlElement *pRoad);

    void addPlanView(TiXmlElement *pRoad, const PlanView planView);
    void delPlanView(TiXmlElement *pRoad);

    void addElevationProfile(TiXmlElement *pRoad, const ElevationProfile elevationProfile);
    void delElevationProfile(TiXmlElement *pRoad);

    void addRoadLanes(TiXmlElement *pRoad, const Lanes lanes);
    void delRoadLanes(TiXmlElement *pRoad);

    void addLaneSectionChild(TiXmlElement *pLaneSectionLayout, const Layout layout);
    
    void addRoadObjects(TiXmlElement *pRoad, const Objects objects);
    void delRoadObjects(TiXmlElement *pRoad);
    
    void addRoadSignals(TiXmlElement *pRoad, const Signals roadSignals);
    void delRoadSignals(TiXmlElement *pRoad);
    //road节点子孙节点内容 end

    //先清空所有controller节点，然后把MapInfo中的controller信息重新添加进去
    void resetController();

    //添加一个controller节点
    void addController(const SController &controller);

    //删除全部controller节点
    void delController();

    //删除指定controller节点
    void delController(const SController &controller);

    //删除指定controller节点
    void delController(const std::string &controllerId);

    //更新指定controller节点
    void updateController(const SController &controller);

    //先清空所有junction节点，然后把MapInfo中的junction信息重新添加进去
    void resetJunction();

    //添加一个junction节点
    void addJunction(const Junction &junction);

    //删除所有junction节点
    void delJunction();

    //删除指定junction节点
    void delJunction(const Junction &junction);

    //删除指定junction节点
    void delJunction(const std::string &junctionId);

    //更新指定junction节点
    void updateJunction(const Junction &junction);

private:
    TiXmlElement *getRoadElement(const SRoad &road);
    TiXmlElement *getControllerElement(const SController &controller);
    TiXmlElement *getJunctionElement(const Junction &junction);
};

#endif // MAPINFOWRITE_H
